/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.graphics;

import com.example.android.apis.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.graphics.drawable.*;
import android.os.Bundle;
import android.view.*;

public class ColorFilters extends GraphicsActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new SampleView(this));

	}

	private static class SampleView extends View {
		private Activity mActivity;
		private Drawable mDrawable;
		private Drawable[] mDrawables;
		private Paint mPaint;
		private Paint mPaint2;
		private float mPaintTextOffset;
		private int[] mColors;
		private PorterDuff.Mode[] mModes;
		private int mModeIndex;

		private static void addToTheRight(Drawable curr, Drawable prev) {
			Rect r = prev.getBounds();
			int x = r.right + 12;
			int center = (r.top + r.bottom) >> 1;
			int h = curr.getIntrinsicHeight();
			int y = center - (h >> 1);

			curr.setBounds(x, y, x + curr.getIntrinsicWidth(), y + h);
		}

		public SampleView(Activity activity) {
			super(activity);
			mActivity = activity;
			Context context = activity;
			setFocusable(true);

			mDrawable = context.getResources().getDrawable(
					R.drawable.btn_default_normal);
			mDrawable.setBounds(0, 0, 150, 48);
			mDrawable.setDither(true);

			int[] resIDs = new int[] { R.drawable.btn_circle_normal,
					R.drawable.btn_check_off, R.drawable.btn_check_on };
			mDrawables = new Drawable[resIDs.length];
			Drawable prev = mDrawable;
			for (int i = 0; i < resIDs.length; i++) {
				mDrawables[i] = context.getResources().getDrawable(resIDs[i]);
				mDrawables[i].setDither(true);
				addToTheRight(mDrawables[i], prev);
				prev = mDrawables[i];
			}

			mPaint = new Paint();
			mPaint.setAntiAlias(true);
			mPaint.setTextSize(16);
			mPaint.setTextAlign(Paint.Align.CENTER);

			mPaint2 = new Paint(mPaint);
			mPaint2.setAlpha(64);

			Paint.FontMetrics fm = mPaint.getFontMetrics();
			mPaintTextOffset = (fm.descent + fm.ascent) * 0.5f;

			mColors = new int[] { 0, 0xCC0000FF, 0x880000FF, 0x440000FF,
					0xFFCCCCFF, 0xFF8888FF, 0xFF4444FF, };

			mModes = new PorterDuff.Mode[] { PorterDuff.Mode.SRC_ATOP,
					PorterDuff.Mode.MULTIPLY, };
			mModeIndex = 0;

			updateTitle();
		}

		private void swapPaintColors() {
			if (mPaint.getColor() == 0xFF000000) {
				mPaint.setColor(0xFFFFFFFF);
				mPaint2.setColor(0xFF000000);
			} else {
				mPaint.setColor(0xFF000000);
				mPaint2.setColor(0xFFFFFFFF);
			}
			mPaint2.setAlpha(64);
		}

		private void updateTitle() {
			mActivity.setTitle(mModes[mModeIndex].toString());
		}

		private void drawSample(Canvas canvas, ColorFilter filter) {
			Rect r = mDrawable.getBounds();
			float x = (r.left + r.right) * 0.5f;
			float y = (r.top + r.bottom) * 0.5f - mPaintTextOffset;

			mDrawable.setColorFilter(filter);
			mDrawable.draw(canvas);
			canvas.drawText("Label", x + 1, y + 1, mPaint2);
			canvas.drawText("Label", x, y, mPaint);

			for (Drawable dr : mDrawables) {
				dr.setColorFilter(filter);
				dr.draw(canvas);
			}
		}

		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawColor(0xFFCCCCCC);

			canvas.translate(8, 12);
			for (int color : mColors) {
				ColorFilter filter;
				if (color == 0) {
					filter = null;
				} else {
					filter = new PorterDuffColorFilter(color,
							mModes[mModeIndex]);
				}
				drawSample(canvas, filter);
				canvas.translate(0, 55);
			}
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				break;
			case MotionEvent.ACTION_MOVE:
				break;
			case MotionEvent.ACTION_UP:
				// update mode every other time we change paint colors
				if (mPaint.getColor() == 0xFFFFFFFF) {
					mModeIndex = (mModeIndex + 1) % mModes.length;
					updateTitle();
				}
				swapPaintColors();
				invalidate();
				break;
			}
			return true;
		}
	}
}
